#include "TaskQueue.h"

TaskQueue::TaskQueue(size_t capa)
: _capacity(capa)
, _que()
, _mutex()
, _notFull()
, _notEmpty()
{

}

TaskQueue::~TaskQueue()
{

}

//生产数据与消费数据
void TaskQueue::push(const int &value)
{
    //1、先上锁
    unique_lock<mutex> ul(_mutex);
    //2、判满
    while(full())
    {
        //2.1、如果任务队列是满的，生产者睡眠
        _notFull.wait(ul);
    }
    //2.2、如果任务队列不满，将数据入队列,将消费者唤醒
    _que.push(value);
    _notEmpty.notify_one();
    //3、最后解锁
}

int TaskQueue::pop()
{
    //1、先上锁
    unique_lock<mutex> ul(_mutex);
    //2、判空
    while(empty())
    {
        //2.1、如果任务队列是空的，消费者睡眠
        _notEmpty.wait(ul);
    }
    //2.2、如果任务队列不空，将数据出队列,将生产者唤醒
    int tmp = _que.front();
    _que.pop();
    _notFull.notify_one();
    //3、最后解锁
    return tmp;
}

//判空与判满
bool TaskQueue::empty() const
{
    return  0 == _que.size();
}

bool TaskQueue::full() const
{
    return _capacity == _que.size();
}
